// 识点1：头文件：#inlude <cctype.h>，ispunct()
// 函数用来检测一个字符是否为标点符号或特殊字符，其原型为：int ispunct(int c);

// 知识点2：目前在头文件iostream中也可以使用，C++ 5.11已证明。把字符转换成小写字母,非字母字符不做出处理用
// 法: int tolower(int c);

// 知识点3：Transforms the range [first,last) into a range with all the elements
// for which pred returns true removed, andreturns an iterator to the new end of
// that range.

#include <algorithm>
#include <cctype> //ctype无法打开，包含tolower()函数和ispunct函数
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char **argv) {
  // map的定义
  map<string, size_t> word_count;
  fstream in("1.txt"); //定义一个输入流
  string word;

  while (in >> word) {
    string::iterator it1;
    for (it1 = word.begin(); it1 != word.end(); ++it1) {
      *it1 = tolower(*it1);
    } //消灭大小写
    word.erase(remove_if(word.begin(), word.end(), ispunct),
               word.end()); //消灭标点符号
    ++word_count[word];
  }

  // map同样支持迭代器操作
  map<string, size_t>::iterator mapi;
  for (mapi = word_count.begin(); mapi != word_count.end();
       ++mapi) // C++ 11支持:const auto &s : word_count
  {
    //两个成员分别代表关键字和对应值
    cout << mapi->first << " ";
    cout << mapi->second << " " << endl;
  }

  return 0;
}